<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category MODEL
   * @package MODELS.
   * @since 02/06/2012.
   * @last_update 02/06/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Application_Model_Paises extends Zend_Db_Table_Abstract{
    const ATIVO = 1;
    const INATIVO = 0;
    
    /**
     * Seta a tabela a ser usada.
     */
    protected function _setup(){
      $this->_name = 'paises';
      parent::_setup();
    } 
    
    public function getColunas(){
    	$arrResult = array();
    	$arrCols = $this->fetchAll()->getTable()->_metadata;
      
    	$arrResult[strtoupper($this->_name)] = $arrCols;
    	return Core_Commons::onLoad($arrResult);
    }
    
    /**
     * Retorna todos os registros ativos
     */
    public function getAtivos(){
      $strSql = $this->select()->where('ds_situacao = ?', self::ATIVO);
      
      $objResult = $this->fetchAll($strSql);
            
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna todos s registro de acordo co mo id
     */
    public function getById($intId){
      $strSql = $this->select()->where($this->_name . '.idPais = ?', $intId);
      
      $objResult = $this->fetchRow($strSql);
                  
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna o resultado de acordo com o nome ou sigla. 
     * 
     * @param string  Nome do pais
     * @param string  Sigla do país.
     * 
     * @return database_result
     */
    public function getByNomeESigla($strDsNome, $strDsSigla){
    	$strSql = $this->select()->where('ds_situacao = ?', self::ATIVO);
      
      if($strDsNome && $strDsSigla)      
        $strSql->where($this->_name . '.ds_pais LIKE ?', '%' . $strDsNome . '%')->where($this->_name . '.ds_sigla = ?', $strDsSigla);  
      elseif($strDsNome && !$strDsSigla)
        $strSql->where($this->_name . '.ds_pais LIKE ?', '%' . $strDsNome . '%');
      elseif(!$strDsNome && $strDsSigla)  
        $strSql->where($this->_name . '.ds_sigla = ?', $strDsSigla);    
      else
        $strSql->where('1 = ?', 1);
         
      $objResult = $this->fetchAll($strSql);

      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Realiza a validação dos dados vindo do formulário
     * 
     * @return void.
     */
    public function validaForm(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*'  =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Sigla'           =>  array('allowEmpty'  => false, 'fields' => 'ds_sigla'),
        'País'            =>  array('allowEmpty'  => false, 'fields' => 'ds_pais'),
        'Moeda'           =>  array('fields' => 'ds_moeda'),
        'Prefixo'         =>  array('fields' => 'ds_prefixo'),
        'Situação'        =>  array('allowEmpty'  => false, 'fields' => 'ds_situacao'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     * Salva um registro. Funcionalidade para inserção e atualização
     * @param integer Id do registro. Se for diferente de null, então será atualizado o regsitro
     * a partir do id, senão será inserido um novo registro.
     * 
     * @return boolean.
     */
    public function salvar($intId = null){
    	$objValida = new Core_ValidaFormulario();
      $objDadosInput = $this->validaForm();
                              
      $arrDados['ds_sigla']       = strtoupper($objDadosInput->ds_sigla);
      $arrDados['ds_pais']        = ucfirst($objDadosInput->ds_pais);
      $arrDados['ds_moeda']       = strtoupper($objDadosInput->ds_moeda);
      $arrDados['ds_prefixo']     = $objDadosInput->ds_prefixo;
      $arrDados['ds_situacao']    = $objDadosInput->ds_situacao;
      
      if(!$objValida->validAlpha($objDadosInput->ds_sigla))
        throw new Exception('A sigla deve conter apenas letras!', '3');
      elseif(strlen($objDadosInput->ds_sigla) != 2)
        throw new Exception('A sigla deve conter 5 letras!', '3');
      elseif(!$objValida->validNumber($objDadosInput->ds_prefixo))
        throw new Exception('O prefixo deve conter apenas números!', '3');
      else{
      	if($intId == null){
      		$arrDados['dt_insercao']    = date('Y-m-d H:i:s');
          $arrDados['dt_atualizacao'] = 'NULL';
          
      		$strSql = $this->select()
          ->where("ds_sigla = '" . $objDadosInput->ds_sigla . "' OR ds_pais = '" . $objDadosInput->ds_pais . "'");

          if($this->fetchAll($strSql)->current())
            throw new Exception('País já cadastrado com a sigla "' . $objDadosInput->ds_sigla . '" ou com o nome "' . $objDadosInput->ds_pais . '"!', '3');
          else
            return $this->insert($arrDados);
      	}
      	else{ 
          $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
      
      		return $this->update($arrDados, 'idPais = ' . $intId);
      	}
      }
    }
    
    /**
     * Exclui um registro  a partir do banco de dados.
     * Um registro nunca será ecluido do banco de dados.
     * Considera-se excluído um registro com status igual a "0".
     * 
     * @param string  clausula where.
     * @return boolean.
     */
    public function excluir($strWhere){
      $boolReturn = false;
      $objDadosInput = $this->validaForm();
      $arrDados['ds_situacao'] = self::INATIVO; 
      $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
      
      if($this->update($arrDados, $strWhere))  
        $boolReturn = true;
      
      return $boolReturn; 
      
    }
    
    
    public function teste(){
    	$sql = $this->getAdapter()->select()->from('teste')->join('teste2', 'teste.id = teste2.id');
    	
    }
  }  